#include <vector>
#include <glibmm-2.4/glibmm/signalproxy.h>
#include <cstdlib>

#include "VentanaMenuCliente.h"

using namespace std;

VentanaMenuCliente::VentanaMenuCliente(Cliente* cliente) : cliente(cliente) {
	ventanaJuego = NULL;

	set_title("Cerditos Furiosos - Menu");
	set_position(Gtk::WIN_POS_CENTER);
	set_border_width(10);

	selector_mundos.signal_changed().connect(sigc::mem_fun(
			*this, &VentanaMenuCliente::on_combo_mundos_changed));
	empezarPartidaButton.signal_clicked().connect(sigc::mem_fun(
			*this, &VentanaMenuCliente::on_empezar_partida_clicked));
	selector_mundos.set_focus_on_click(false);

	Gtk::Label *etiqueta;

	etiqueta = Gtk::manage(
			new Gtk::Label("MENU PRINCIPAL", Gtk::ALIGN_CENTER));
	grilla.attach(*etiqueta, 0, 0, 2, 1);

	etiqueta = Gtk::manage(
			new Gtk::Label("Escoge un Mundo:", Gtk::ALIGN_CENTER));
	grilla.attach(*etiqueta, 0, 1, 1, 1);
	grilla.attach_next_to(selector_mundos, *etiqueta, Gtk::POS_RIGHT, 1, 1);

	etiqueta = Gtk::manage(
			new Gtk::Label("Escoge un Nivel:", Gtk::ALIGN_CENTER));
	grilla.attach(*etiqueta, 0, 2, 1, 1);
	grilla.attach_next_to(selector_niveles, *etiqueta, Gtk::POS_RIGHT, 1, 1);

	etiqueta = Gtk::manage(
			new Gtk::Label("Nombre de tu partida:", Gtk::ALIGN_CENTER));
	grilla.attach(*etiqueta, 0, 3, 1, 1);
	grilla.attach_next_to(nombrePartida, *etiqueta, Gtk::POS_RIGHT, 1, 1);

	empezarPartidaButton.set_label("Crear partida");
	grilla.attach(empezarPartidaButton, 0, 5, 2, 1);

	grilla.set_column_spacing(10);
	grilla.set_row_spacing(10);

	add(grilla);

	// Le pedimos los mundos al cliente y los cargamos en el combo box
	vector<string> vectorMundos = cliente->listarMundos();
	cargarMundosAlComboBox(vectorMundos);

	// Carga los niveles
	on_combo_mundos_changed();

	set_border_width(10);
	show_all_children();
	show_all();
}

VentanaMenuCliente::~VentanaMenuCliente() {}

void VentanaMenuCliente::cargarMundosAlComboBox(
		std::vector<std::string>& vectorMundos) {
	selector_mundos.remove_all();
	std::vector<std::string>::iterator it;

	for (it = vectorMundos.begin(); it != vectorMundos.end(); ++it) {
		selector_mundos.append(*it);
	}
}

void VentanaMenuCliente::cargarNivelesAlComboBox(
		std::vector<std::string>& vectorMundos) {
	selector_niveles.remove_all();
	std::vector<std::string>::iterator it = vectorMundos.begin();

	for (; it != vectorMundos.end(); ++it) {
		selector_niveles.append(*it);
	}
}

void VentanaMenuCliente::on_combo_mundos_changed() {
	string mundoSeleccionado = selector_mundos.get_active_text();
	vector<string> nivelesMundoSeleccionado =
			cliente->listarNiveles(mundoSeleccionado);

	// Cargamos los niveles al ComboBoxText
	cargarNivelesAlComboBox(nivelesMundoSeleccionado);
}

void VentanaMenuCliente::on_empezar_partida_clicked() {
	string mundo = selector_mundos.get_active_text();
	string nivel = selector_niveles.get_active_text();

	Partida* nuevaPartida;

	// Creamos la partida en el servidor
	try {
		nuevaPartida = cliente->crearPartida(
				mundo, atoi(nivel.c_str()), nombrePartida.get_text());
		if (ventanaJuego) delete ventanaJuego;

		unsigned int alto =
				nuevaPartida->ArenaJuego()->getPerimetro()->getAlto();
		unsigned int ancho =
				nuevaPartida->ArenaJuego()->getPerimetro()->getAncho();

		ventanaJuego = new VentanaJuego(cliente, ancho, alto);

		ventanaJuego->Iniciar();

		this->hide();
	}
	catch (Excepcion& pEx) {
	}
}
